package com.sto.stoapp.activity.aviation;

import android.annotation.SuppressLint;
import android.bluetooth.BluetoothAdapter;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.TextView;

import com.sto.stoapp.activity.R;
import com.sto.stoapp.broadcast.HomeBroadAction;
import com.sto.stoapp.dataprocess.ProcessScanCode;
import com.sto.stoapp.db.StoDataBaseOperation;
import com.sto.stoapp.db.StoFilePreference;
import com.sto.stoapp.db.manager.RouteManager;
import com.sto.stoapp.db.manager.SiteFullManager;
import com.sto.stoapp.entity.DataBusinessEntity;
import com.sto.stoapp.entity.RouteEntity;
import com.sto.stoapp.listener.StoOnClickListener;
import com.sto.stoapp.log.ExceptionLog;
import com.sto.stoapp.manager.BlueWeigthManager;
import com.sto.stoapp.manager.SoundManager;
import com.sto.stoapp.status.EnumScanCode;
import com.sto.stoapp.status.EnumTableNames;
import com.sto.stoapp.thread.BlueReadThread;
import com.sto.stoapp.util.BillFilterUtil;
import com.sto.stoapp.util.Helper;
import com.sto.stoapp.util.UnifiedStaticType;
import com.sto.stoapp.widget.BaseDialog;
import com.sto.stoapp.widget.StoHhmEditText;
import com.sto.stoapp.widget.StoHhmEditText.EditClickListener;
import com.sto.stoapp.widget.StoHhmEditText.EditScanListener;
import com.sto.stoapp.widget.StoListenerActivity;

import java.util.ArrayList;
import java.util.List;

import sto.android.app.StoPdaKeyEvent;

@SuppressLint("HandlerLeak")
public class StoSendPieceByRouteActivity extends StoListenerActivity {

    private StoHhmEditText route;
    private StoHhmEditText nextStation;
    private StoHhmEditText centerDes;
    private StoHhmEditText carID;
    private StoHhmEditText code;
    private TextView weight;
    private RadioButton goods, notgoods;
    private DataBusinessEntity dataBusiness;

    private List<EditText> edit = new ArrayList<EditText>();

    private int itemType = 1;
    // 车辆ID必须是6位
//    private int CARID_LENGTH = 6;
    

    private String nextStationCode = "";
    private String nextStationName = "";
    // 路由号
    private String routeCode = "";
    // 二级中转目的地
    private String centerDesCode = "";
    private String centerDesName = "";

    // 24小时上传到服务器需要做一个区分，用1表示
    private boolean IS_24HOURS = false;

    private float blueWeight = -1;
    // 防止多次弹出提示框
    private boolean FLAG_STATUS = false;

    private String billNo="";

    private BaseDialog filterDialog=null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sto_avi_send_by_route);
        this.setTitleBottom(R.string.send_piece_by_route,
                HomeBroadAction.AVIATION_SCANNER_BROAD);
        IS_24HOURS = this.getIntent().getBooleanExtra(
                UnifiedStaticType.IS_24HOURS, false);
        dataBusiness = new DataBusinessEntity();
        dataBusiness.initInsertData();
        initPointLayout(true);
        initWidget();
        initListen();
        initScanRecordAdapter(EnumTableNames.STATUS_TABLE_AVIATION_SCAN_SEND);
        bluetoothConnect();
    }

    /*
     * 初始化控件
     */
    private void initWidget() {
        route = (StoHhmEditText) findViewById(R.id.avi_route_number);
        nextStation = (StoHhmEditText) this.findViewById(R.id.avi_next_station);
        centerDes = (StoHhmEditText) findViewById(R.id.avi_destination);
        carID = (StoHhmEditText) this.findViewById(R.id.avi_carID);
        code = (StoHhmEditText) this.findViewById(R.id.avi_odd_numbers_text);
        weight = (TextView) this.findViewById(R.id.enter_count);
        goods = (RadioButton) this.findViewById(R.id.avi_goods_sample);
        notgoods = (RadioButton) this.findViewById(R.id.avi_no_goods_sample);
        edit.add(nextStation);
        edit.add(centerDes);
        edit.add(carID);
        edit.add(code);
    	addUploadTable(EnumTableNames.STATUS_TABLE_AVIATION_SCAN_SEND);
    }

    // 处理扫描数据
    @SuppressLint("NewApi")
    private void processScanData() {
        try {
            if (!weight.getText().toString().isEmpty() && blueWeight <= 0) {
                Helper.showSoundToast(this, getString(R.string.no_weight_data),
                        false);
                return;
            }
            if (route.getText().toString().length() <= 0) {
                Helper.showSoundToast(this, getString(R.string.route_is_empty),
                        false);
                route.setText("");
                route.requestFocus();
                return;
            } else {
                if (nextStationCode.length() <= 0
                        || centerDesCode.length() <= 0) {
                    Helper.showSoundToast(this,
                            getString(R.string.route_is_undefined), false);
                    route.setText("");
                    route.requestFocus();
                    return;
                }
            }
            // 检查车辆码
            if (!checkCarCode()) {
                return;
            }

            billNo=code.getText().toString();
            float maxWeight=StoFilePreference.getInstance(this).getBlueWeight();

            if(blueWeight>maxWeight){
                ScanOff();
                filterDialog=new BaseDialog(this);
                filterDialog.setTitles("重量限制为【" + maxWeight + "】\n当前重量为【" + blueWeight + "】\n请确认重量是否准确");
                filterDialog.show();
                filterDialog.getvCanncel().setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        filterDialog.dismiss();
                        ScanOpen();
                    }
                });
                filterDialog.getvAccept().setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        filterDialog.dismiss();
                        //Add by wj过滤单号
                        boolean isFilter= BillFilterUtil.isFilter(billNo,StoSendPieceByRouteActivity.this);
                        if(isFilter){
                            showFilterDialog(billNo);
                            return;
                        }
                        //End by wj
                        if (addPieceRecord(billNo)) {
                            addCodeNumber();
                            setSaveData(true);
                            Helper.showSoundAndVibrator(StoSendPieceByRouteActivity.this, true);
                            code.setSelection(code.length());
                            addScanRecordInfo(billNo,weight.getText().toString());
                            code.setText("");
                        }
                        // 提示插入数据失败
                        else {
                            Helper.showSoundToast(StoSendPieceByRouteActivity.this, getString(R.string.code_repeat),
                                    false);
                        }
                        ScanOpen();
                    }
                });
            }else {
                //Add by wj过滤单号
                boolean isFilter= BillFilterUtil.isFilter(billNo,this);
                if(isFilter){
                    showFilterDialog(billNo);
                    return;
                }
                //End by wj
                if (addPieceRecord(billNo)) {
                    this.addCodeNumber();
                    setSaveData(true);
//                SoundManager.getInstance(this).playSuccessSound();
                    Helper.showSoundAndVibrator(this, true);
                    code.setSelection(code.length());
                    addScanRecordInfo(billNo,weight.getText().toString());
                    code.setText("");
                }
                // 提示插入数据失败
                else {
                    Helper.showSoundToast(this, getString(R.string.code_repeat),
                            false);
                }
                ScanOpen();
            }
        } catch (Exception e) {
            e.printStackTrace();
            ExceptionLog.writeLog("processScanData", e.getMessage());
        }
    }

    /**
     * 检查车辆码规则
     */
    private boolean checkCarCode() {
        if (carID.getText().toString().length() > 0
                && carID.length() != CARID_LENGTH) {
            Helper.showSoundToast(this,
                    getString(R.string.car_id_median_error), false);
            carID.setText("");
            carID.requestFocus();
            return false;
        }
        if (carID.getText().toString().length() > 0
                && !carID.getText().toString().matches("[0-9]+")) {
            Helper.showSoundToast(this, "车辆id非法", false);
            carID.setText("");
            carID.requestFocus();
            return false;
        }
        return true;
    }

    // 增加一条记录
    private boolean addPieceRecord(String billNo) {
        boolean ret;

        // 扫描类型
        dataBusiness.setCommand_type(EnumTableNames.STATUS_TABLE_AVIATION_SCAN_SEND.getOpCode());
        // 单号
        dataBusiness.setBar_code_number(billNo);
        
        dataBusiness.setCodeType(getExpType(billNo));
        // 物品类别
        dataBusiness.setFunction_type(String.valueOf(itemType));
        // 车辆ID
        dataBusiness.setCarID_number(carID.getText().toString());
        // 下一站
        dataBusiness.setNext_station(nextStationCode);
        // 目的地
        dataBusiness.setUser_defined3(centerDesCode);
        // 路由
        if (routeCode.length() <= 0) {
            dataBusiness.setReason_number("");
        } else {
            dataBusiness.setReason_number(routeCode);
        }
        // 网点编号
        dataBusiness.setNet_code(StoFilePreference.getInstance(this)
                .getSiteCode());
        // 工号
        dataBusiness.setJob_number(StoFilePreference.getInstance(this)
                .getUserCode());

        // 蓝牙重量
        if (blueWeight > 0) {
            // 重量
            dataBusiness.setWeight(String.valueOf(blueWeight));
            blueWeight = -1;
        }
        if (IS_24HOURS == true) {
            dataBusiness.setExpress_type("1");
        }
        /**区别发件 */
        dataBusiness.setDifferent_flag("route");
        // 插入数据
        ret = StoDataBaseOperation.getInstance(this).insert(dataBusiness,
                EnumTableNames.STATUS_TABLE_AVIATION_SCAN_SEND);
//		if (!ret && !("").equals(dataBusiness.getWeight())) {
//			ret = StoDataBaseOperation.getInstance(this).replace(dataBusiness,
//					EnumTableNames.STATUS_TABLE_AVIATION_SCAN_SEND);
//			if (ret) {
//				removeItem(code.getText().toString(),1);
//			}
//		}
       
        return ret;
    }

    /**
     * 通过路由号查找表
     * 如果能查到数据，将下一站和二级中转目的地的数据显示在输入框中
     * 注：路由表只能精确查询
     */
    private void selectRoute(boolean isFocus) {
        try {
            routeCode = route.getText().toString();
            QueryRouteThread thread = new QueryRouteThread(isFocus);
            thread.start();
        } catch (Exception e) {
            e.printStackTrace();
            ExceptionLog.writeLog("selectRoute", e.getMessage());
        }
    }

    /*
     * 监听控件
     */
    @SuppressLint("NewApi")
    private void initListen() {
		setBluetoothCloseOpenListener(new BluetoothCloseOpenListener() {
			
			@Override
			public void listener() {
				closeBluetooth();
			  new CloseThread().start();
				
			}
		});
        goods.setOnClickListener(new StoOnClickListener(this) {

            @Override
            public void mHonClick(View v) {
                itemType = 1;
                notgoods.setChecked(false);
            }
        });

        notgoods.setOnClickListener(new StoOnClickListener(this) {

            @Override
            public void mHonClick(View v) {
                itemType = 2;
                goods.setChecked(false);
            }
        });
        route.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

            }

            @Override
            public void afterTextChanged(Editable s) {
                if(!TextUtils.isEmpty(nextStationCode)){
                    nextStation.setText("");
                    centerDes.setText("");
                    nextStationCode="";
                    routeCode="";
                }
            }
        });
        route.setEditDelete(new EditClickListener() {

            @Override
            public void onEditDelete() {
                onBackPressed();
            }

            @Override
            public void onEditClickListener(View v) {
//                selectRoute(true); // 搜索路由数据
            }
        });
        findViewById(R.id.btn_select).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Add by wj选择路由号
                selectRoute();
            }
        });
        carID.setEditDelete(new EditClickListener() {

            @Override
            public void onEditDelete() {
                goods.requestFocus();
            }

            @Override
            public void onEditClickListener(View v) {
                if (checkCarCode()) {
                    code.requestFocus();
                }
            }
        });
        code.setEditDelete(new EditClickListener() {

            @Override
            public void onEditDelete() {
                carID.requestFocus();
            }

            @Override
            public void onEditClickListener(View v) {
            	codeProcess();
                /*if (code.getText().length() == ProcessScanCode.SCAN_LEASTCODE_LENGTH
                        || code.getText().length() == ProcessScanCode.SCAN_MAXCODE_LENGTH) {
                    onScanResults(code.getText().toString());
                } else {
                    Helper.showSoundToast(StoSendPieceByRouteActivity.this,
                            getString(R.string.code_count_error), false);
                    code.setText("");
                }*/
            }
        });

        code.setEditScanListener(new EditScanListener() {

            @Override
            public void onScan() {
                ScanOpen();
            }

            @Override
            public void offScan() {
                ScanOff();
            }
        });

        for (EditText editListener : edit) {
            /*
             * 监听EditText内容个数
             */
            editListener.addTextChangedListener(new TextWatcher() {

                @Override
                public void onTextChanged(CharSequence s, int start,
                        int before, int count) {
                    // 控件没有内容就清空编号
                    if (nextStation.getText().toString().isEmpty()) {
                        nextStationCode = "";
                        //                        nextStationName = "";
                    }
                }

                @Override
                public void beforeTextChanged(CharSequence s, int start,
                        int count, int after) {
                }

                @Override
                public void afterTextChanged(Editable s) {

                }
            });
        }
    }

    /**
	 * 单号逻辑处理判断
	 * @author wxf
	 *
	 */
	private void codeProcess(){
		String codeName = code.getText().toString();

		if(codeName.length() == 0){
			Helper.showSoundToast(this,
					 getString(R.string.code_empty), false);
		}else{
			// 如果扫描的单号是路由
            if (ROUTE_MIN_LENGTH <= codeName.length() &&  codeName.length() <= ROUTE_MAX_LENGTH) {
                route.setText(codeName);
                selectRoute(false);
				code.setText("");
            }
			else{
				onScanResults(codeName);
				/*if (CheckScanCode(code.getText().toString())) {
			        onScanResults(code.getText().toString());
			    } else {
			        code.setText("");
			    }*/
			}
		}
	}
    
    
    
    @Override
    public void onBackPressed() {
 
        showNotice();
    }

    /**
     * 扫描码判断
     * 
     * @param code
     *            扫描码
     * @return true/ok or false
     */
    private boolean CheckScanCode(String code) {
        boolean ret = false;
        EnumScanCode status = ProcessScanCode.getInstance(this)
                .ScanCodeResolve(code,
                        EnumTableNames.STATUS_TABLE_AVIATION_SCAN_SEND);

        switch (status) {
        // 条码空
        case CODE_EMPTY:
            //          Helper.showSoundToast(
            //                  this,
            //                  getString(R.string.code_empty), false);
            break;

        // 非法条码
        case CODE_ILLEGAL:
            Helper.showSoundToast(this, getString(R.string.error_code), false);
            break;
        // 成功条码
        case CODE_WAY_BILL:

            ret = true;
            break;
        default:
            break;
        }

        return ret;
    }

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        if ((goods.isFocused() || notgoods.isFocused())
                && keyCode == StoPdaKeyEvent.KEYCODE_DEL) {
            route.requestFocus();
        }
        return super.onKeyUp(keyCode, event);
    }

    /**
	 * 蓝牙连接
	 * 
	 * @author wxf
	 * 
	 */
	private void bluetoothConnect() {
		mBTAdapter = BluetoothAdapter.getDefaultAdapter();

		if (mBTAdapter != null) {
			if (mBTAdapter.isEnabled()) {
				weight.setText(R.string.now_connect_blue);
				blueConnecting();
			} else {
				//weight.setText(R.string.blue_no_open);
			}
		} else {
//			promptDialog(getText(R.string.blue_not_available).toString());
		}
	}
	
	/**
	 * 蓝牙正式连接
	 */
	private void blueConnecting() {
		String macAddress = StoFilePreference.getInstance(this)
				.getBluetoothMacAddress();
		if (!macAddress.equals("")) {
			if (blueConnectThread != null) {
				blueConnectThread.cancelDialog();
				blueConnectThread.clearBlueDevices();
				blueConnectThread = null;
			}
//			weight.setEnabled(false);
			blueConnectThread = new BlueReadThread(this,
					bluetoothHandler, macAddress, false);
			blueConnectThread.start();
		} else {
			weight.setText(R.string.select_blue_scales);
		}
	}
	
	private Handler bluetoothHandler = new Handler() {

		@Override
		public void handleMessage(Message msg) {
			Log.d("logdebug:", "msg.what:" + msg.what);
			if (msg.what == BlueWeigthManager.UPDATE_BLUE_DATA) {
				if (blueConnectThread != null) {
					blueConnectThread.cancelDialog();
				}
				if (msg.obj != null && !msg.obj.toString().equals("")) {
					String result = msg.obj.toString();
					Log.d("msg=", String.valueOf(result));
					// 表示连接蓝牙失败
					if (result.equals(BlueWeigthManager.CONNECT_FAIL)) {
						blueWeight = -1;
						if (blueConnectThread != null) {
							if(blueConnCount < 3){
								blueConnecting();
								blueConnCount++;
								weight.setText(
									getText(R.string.blue_connect_fail).toString() + ",正在重连" + blueConnCount + "...");
							}else{
								blueConnCount = 0;
								weight.setText(
										getText(R.string.blue_connect_fail).toString() + ",请到系统设置, 重新设置蓝牙!");
							}
						}
					}
					// 没有选择秤型号
					else if (result
							.equals(BlueWeigthManager.NO_SELECT_SCALE_MODEL)) {
						blueWeight = -1;
						if (blueConnectThread != null) {
							weight.setText(
									getText(R.string.no_select_scales_model).toString() + "请到系统设置,设置蓝牙!");
							
						}
						
					}
					// 读取数据失败
					else if (result.equals(BlueWeigthManager.READ_ERROR)) {
						blueWeight = -1;
						if (blueConnectThread != null) {
							weight.setText(
									R.string.get_data_error);
						}
					} else {
						// 显示重量
						blueWeight = parseFloat(result);
						weight.setText(result);
					}
				}
			}
		}

	};



    @Override
    protected void onDestroy() {
        // 取消蓝牙连接
        edit.clear();
        edit = null;
   //     closeBluetooth();
        bluetoothHandler.removeMessages(BlueWeigthManager.UPDATE_BLUE_DATA);
        super.onDestroy();
    }

    @Override
    protected void onResume() {
        super.onResume();
    }
//	@Override
//	protected void doBack() {
//		if (BluetoothAdapter.getDefaultAdapter().isEnabled()
//				&& blueConnectThread != null && !blueConnectThread.isConnected()) {
//			handler.sendEmptyMessageAtTime(5, 5000);
//			showDialog();
//		} else {
//			super.doBack();
//		}
//	}
   /* // 设置蓝牙
    private void selectBlueDevice(String str) {
        if (FLAG_STATUS)
            return;
        FLAG_STATUS = true;
        BaseDialog dialog = new BaseDialog(this);
        dialog.setTitles(str + " " + getString(R.string.yesorno_set_blue));
        dialog.show();
        dialog.setOnBackClickListener(new OnBackClickListener() {

            @Override
            public void onBackClickListener(boolean res) {
                if (res) {
                    // 取消蓝牙连接
                    if (mBTAdapter != null) {
                        if (mBTAdapter.isEnabled()) {
                            if (bluemanager != null) {
                                bluemanager.cancelConnect();
                                bluemanager = null;
                            }
                        }
                    }
                    Intent intent = new Intent(
                            StoSendPieceByRouteActivity.this,
                            SystemBlueWeigthSettingActivity.class);
                    intent.putExtra("busiType",
                            HomeBroadAction.AVIATION_SCANNER_BROAD);
                    startActivity(intent);
                }
                FLAG_STATUS = false;
            }
        });
    }*/

    /**
     * 查询路由号信息线程
     * @author Administrator
     *
     */
    class QueryRouteThread extends Thread {
    	boolean isFocus = true;
    	public QueryRouteThread(boolean isFocus) {
			// TODO Auto-generated constructor stub
    		this.isFocus = isFocus;
		}
        @Override
        public void run() {
            super.run();
            final RouteEntity entity = RouteManager.getInstance(
                    StoSendPieceByRouteActivity.this).queryByRouteCode(
                    routeCode);
            /**
             * 查询下一站网点表，显示网点名称
             */
            if (entity != null) {
                nextStationCode = entity.getNextStation();
                centerDesCode = entity.getCenterDes();
                if (entity.getNextStation().length() > 0) {
                    nextStationName = SiteFullManager.getInstance(
                            StoSendPieceByRouteActivity.this)
                            .querySiteCodeName(nextStationCode);
                }
                if (entity.getCenterDes().length() > 0) {
                    centerDesName = SiteFullManager.getInstance(
                            StoSendPieceByRouteActivity.this)
                            .querySiteCodeName(centerDesCode);
                }
            }
            runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    if (entity != null) {
                        nextStation
                                .setText((nextStationName.length() > 0) ? nextStationName
                                        : nextStationCode);
                        centerDes
                                .setText((centerDesName.length() > 0) ? centerDesName
                                        : centerDesCode);
                        if(isFocus){
                        	goods.requestFocus();
                        }
                        
                    } else {
                        route.setText("");
                        routeCode = "";
                        nextStationCode = "";
                        nextStationName = "";
                        nextStation.setText("");
                        centerDesCode = "";
                        centerDesName = "";
                        centerDes.setText("");
                        Helper.showSoundToast(StoSendPieceByRouteActivity.this,
                                "未定义，请到业务设置中更新数据", false);
                    }
                }
            });
        }
    }

	@Override
	protected void handlerScanData(String scanData) {

        if(null!=filterDialog && filterDialog.isShowing()){
            return;
        }

        if (scanData != null && !scanData.equals("")) {
            String result = scanData;

            // 如果扫描的单号是路由
            if (ROUTE_MIN_LENGTH <= result.length() &&  result.length() <= ROUTE_MAX_LENGTH) {
                route.setText(result);
                SoundManager.getInstance(StoSendPieceByRouteActivity.this).playSuccessSound();
                selectRoute(true);
            }
            // 如果扫描的单号是车辆码
            /*else if (result.length() == CARID_LENGTH) {
                carID.setText(result);
            }*/ else {
                code.setText(result);
                code.setSelection(code.length());

                if (CheckScanCode(result)) {
                    processScanData();
                }
                code.setText("");
            }
        } else {
        }
	}


    //Add by wj

    /**
     * 选择路由号
     */
    private void selectRoute(){
        String routeStr=route.getText().toString().trim();
        Intent intent=new Intent(this,StoAviSelectRouteActivity.class);
        intent.putExtra("routeCode",routeStr);
        startActivityForResult(intent,0);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode){
            case 0:

                if(data!=null){
                    RouteEntity routeEntity=data.getParcelableExtra("route");
                    route.setText(routeEntity.getRouteCode());
                    selectRoute(true);
                }

                break;
        }
    }
}
